package com.tedu.egweibo.controller;


import com.tedu.egweibo.common.result.JsonResult;
import com.tedu.egweibo.common.result.StatusCode;
import com.tedu.egweibo.mapper.UserMapper;
import com.tedu.egweibo.pojo.dto.UserLoginDTO;
import com.tedu.egweibo.pojo.dto.UserRegDTO;
import com.tedu.egweibo.pojo.entity.User;
import com.tedu.egweibo.pojo.vo.UserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;

import javax.servlet.http.HttpSession;
import java.util.Date;

@RestController
@RequestMapping("/v1/users")
@Api(tags = "用户模块")
@Slf4j
public class UserController {

    @Autowired
    private UserMapper userMapper;

    // 注册
    @PostMapping("/reg")
    @ApiOperation("注册功能")
    public JsonResult insertUser(@RequestBody @Validated UserRegDTO userRegDTO){
        log.info("userRegDTO:{}",userRegDTO);
        // 判断用户输入的信息是否为空
        /*if (userRegDTO.getUsername()==null||userRegDTO.getUsername().isEmpty()
                ||userRegDTO.getPassword()==null||userRegDTO.getPassword().isEmpty()
                ||userRegDTO.getNickname()==null||userRegDTO.getNickname().isEmpty()){
            throw new RuntimeException("用户输入的信息不能为空");
        }*/
        // 判断用户名是否重复
        User userreg=userMapper.selectByUsername(userRegDTO.getUsername());
        log.debug("通过昵称查询用户信息userreg:{}",userreg);
        if (userreg!=null){
            // 用户名重复
            return new JsonResult(StatusCode.USERNAME_EXIST);
        }
        // 注册
        User user=new User();
        BeanUtils.copyProperties(userRegDTO,user);
        user.setCreated(new Date());
        log.debug("user注册时的用户信息:{}",user);
        userMapper.insert(user);
        return JsonResult.success();
    }

    // 登录
    @PostMapping("/login")
    @ApiOperation("登录功能")
    public JsonResult login(@RequestBody @Validated UserLoginDTO userLoginDTO, @ApiIgnore HttpSession session){
        log.info("userLoginDTO:{}",userLoginDTO);
        // 通过用户名获取用户信息
        User user=userMapper.selectByUsername(userLoginDTO.getUsername());
        log.debug("通过用户名查询用户信息user:{}",user);
        // 判断用户是否存在 即用户名输入错入
        if (user==null){
            return new JsonResult(StatusCode.USERNAME_ERROR);
        }
        if (!user.getPassword().equals(userLoginDTO.getPassword())){
            // 密码输入错误
            return new JsonResult(StatusCode.PASSWORD_ERROR);
        }
        // 登录成功
        // 将用户信息保存到session中
        log.debug("存入到session中的user:{}",user);
        session.setAttribute("user",user);
        log.info("登录成功");
        return JsonResult.success();
    }

    // 获取当前用户的登录状态
    @GetMapping("/currentUser")
    @ApiOperation("获取当前用户的登录状态")
    public JsonResult currentUser(@ApiIgnore HttpSession session){
        User user=(User) session.getAttribute("user");
        log.info("currentUser获取当前用户的登录状态user:{}",user);
        if (user==null){
            // 未登录
            return new JsonResult(StatusCode.NOT_LOGIN);
        }
        UserVO userVO=new UserVO();
        // 将user中的数据拷贝到userVO中
        BeanUtils.copyProperties(user,userVO);
        log.debug("当前用户信息:{}",userVO);
        return JsonResult.success(userVO);
    }

    // 退出登录
    @GetMapping("/logout")
    @ApiOperation("退出登录功能")
    public void logout(@ApiIgnore HttpSession session){
        // 清除session
        log.info("退出登录");
        session.removeAttribute("user");
    }


}
